import java.util.ArrayList;
public class BudgetTracker {
    // 私有的（只有本类中可以使用） 静态的（类创建 通过类调用的静态（类）属性） 动态数组（一种集合框架） 设置了泛型（<>） 只能有Double对象
    private static ArrayList<Double> income = new ArrayList<>();
    private static ArrayList<Double> expense = new ArrayList<>();

    // 添加收入
    public static void addIncome(double amount) {
        // 在末尾添加Double对象 传double值 自动装箱
        income.add(amount);
        System.out.println("收入 " + amount + " 已记录。");
    }

    // 添加支出
    public static void addExpense(double amount) {
        expense.add(amount);
        System.out.println("支出 " + amount + " 已记录。");
    }

    // 显示总收入、总支出和余额 对存储在 income 和 expense 这两个 ArrayList<Double> 中的元素进行汇总，并计算余额
    // 静态方法 可以在别的类中的主方法通过类名直接调用，或者在本类直接使用，不需要创建类的实例
    public static void showBalance() {
        // 计算总收入：
        // 将集合变成一个流 可以对流进行映射等操作
        // mapToDouble 是 Java Stream API 中的一种“中间操作”。它将流中的每个对象按照指定的规则映射为新的数据类型。
        // 具体到这里，它将 ArrayList<Double> 中的 Double 对象转换为基本数据类型 double。
        // doubleValue()是Double对象中转换为double基本数据类型的方法  mapToDouble返回的对象是DoubleSteam可以使用sum等操作（对基本数据类型操作）
        double totalIncome = income.stream().mapToDouble(Double::doubleValue).sum();
        // 计算总支出
        double totalExpense = expense.stream().mapToDouble(Double::doubleValue).sum();
        double balance = totalIncome - totalExpense;

        System.out.println("总收入: " + totalIncome);
        System.out.println("总支出: " + totalExpense);
        System.out.println("余额: " + balance);
    }

    public static void main(String[] args) {

        // 示例操作
        addIncome(5000.0);
        addExpense(2000.0);
        showBalance();
    }
}
